package com.wsg.dep.seq;


import com.wsg.dep.exception.InsufficientCapacityException;

/**
 * 序列号控制器
 */
public interface Sequenced {
    /**
     * 获取环形队列的容量大小
     * @return
     */
    int getBufferSize();

    /**
     * 用于检查是否有足够的可用容量来容纳指定数量的事件。
     * @param requiredCapacity 指定的容量大小
     * @return
     */
    boolean hasAvailableCapacity(int requiredCapacity);

    /**
     * 剩余可用容量
     * @return
     */
    long remainingCapacity();

    /**
     * 下一个序列
     * @return
     */
    long next();

    /**
     * 指定位置的下一个序列
     * @param sequence
     * @return
     */
    long next(int sequence);

    /**
     * 尝试获取下一个
     * @return
     * @throws InsufficientCapacityException
     */
    long tryNext() throws InsufficientCapacityException;

    /**
     * 尝试获取指定位置的下一个
     * @param sequence
     * @return
     * @throws InsufficientCapacityException
     */
    long tryNext(int sequence) throws InsufficientCapacityException;

    /**
     * 发布指定序号的事件
     * @param sequence
     */
    void publish(long sequence);

    /**
     * 发布从 lower 到 upper 序号范围的事件
     * @param lower
     * @param upper
     */
    void publish(long lower, long upper);
}